package util;

import java.util.ArrayList;
import java.util.List;

import modelo.Oferta;
import modelo.OrdenDeCompra;
import modelo.Producto;
import modelo.query.InvalidQueryException;
import modelo.query.QueryTranslator;
import modelo.reglas.composite.inner.GroupSpecification;

public class QueryUtils {

	public static List<GroupSpecification<Producto>> materializeQuery(
			List<Oferta> availableOffers) throws InvalidQueryException {

		QueryTranslator qt = new QueryTranslator();

		List<GroupSpecification<Producto>> materialized = new ArrayList<GroupSpecification<Producto>>();

		for (Oferta oferta : availableOffers) {
			materialized.add(qt.translateQueryForProduct(oferta));
		}

		return materialized;
	}

	public static List<GroupSpecification<OrdenDeCompra>> materializeQuerySellOffers(
			List<Oferta> availableOffers) throws InvalidQueryException {

		QueryTranslator qt = new QueryTranslator();

		List<GroupSpecification<OrdenDeCompra>> materialized = new ArrayList<GroupSpecification<OrdenDeCompra>>();

		for (Oferta oferta : availableOffers) {
			materialized.add(qt.translateQueryForSell(oferta));
		}

		return materialized;
	}

	public static List<Oferta> fromMaterializedToOffer(
			List<GroupSpecification<Producto>> mejorCombinacionPosible) {

		List<Oferta> ofertasMaterializadas = new ArrayList<Oferta>();

		for (GroupSpecification<Producto> specification : mejorCombinacionPosible) {
			ofertasMaterializadas.add(specification.getOfertaOriginal());
		}

		return ofertasMaterializadas;
	}

	public static GroupSpecification<Producto> materializeQuery(Oferta oferta)
			throws InvalidQueryException {
		QueryTranslator qt = new QueryTranslator();

		return qt.translateQueryForProduct(oferta);

	}

}
